package robot

import (
	"context"
	"errors"
	"fmt"
	"github.com/go-resty/resty/v2"
	"kratosDingTalk/internal/conf"
	"kratosDingTalk/internal/utils"
	"net/http"
)

//type DingMsg struct {
//	Msgtype  string `json:"msgtype"`
//	Markdown struct {
//		Title string `json:"title"`
//		Text  string `json:"text"`
//	} `json:"markdown"`
//	At struct {
//		AtMobiles []string `json:"atMobiles"`
//		AtUserIds []string `json:"atUserIds"`
//		IsAtAll   bool     `json:"isAtAll"`
//	} `json:"at"`
//}

type DingMsg struct {
	Msgtype  string      `json:"msgtype"`
	Markdown MarkdownMsg `json:"markdown"`
	At       AtInfo      `json:"at"`
}

type MarkdownMsg struct {
	Title string `json:"title"`
	Text  string `json:"text"`
}

type AtInfo struct {
	AtMobiles []string `json:"atMobiles"`
	AtUserIds []string `json:"atUserIds"`
	IsAtAll   bool     `json:"isAtAll"`
}

type DingRobot struct {
	Webhook    string `json:"webhook"` //机器人详情页看的该机器人特有的webhookUrl
	httpClient *resty.Client
}

func (d *DingRobot) SendMarkdownMessage(ctx context.Context, title string, msg string) error {
	text := DingMsg{
		Msgtype: "markdown",
		Markdown: MarkdownMsg{
			Title: title,
			Text:  msg,
		},
		// Notice 选择消息@的人
		// Notice markdown格式只能 @所有人 可能是钉钉的bug～
		At: AtInfo{
			AtMobiles: []string{}, // 手机号
			AtUserIds: []string{}, // 用户id 只有企业管理员可以从后台能查到用户id
			IsAtAll:   true,       // 为 true的话 @所有人
		},
	}

	resp, errResp := d.httpClient.R().
		SetContext(ctx).
		SetHeader("Content-Type", "application/json;charset=utf-8").
		SetBody(text).
		Post(d.Webhook)

	if errResp != nil {
		return errors.New(fmt.Sprintf("给钉钉机器人发送POST请求失败 err: %v", errResp))
	}

	if resp.StatusCode() != http.StatusOK {
		return errors.New(fmt.Sprintf("给钉钉机器人发送POST请求返回错误码! statusCode: %v, resp: %v", resp.StatusCode(), resp))
	}

	fmt.Println("钉钉机器人返回: ", resp.String())

	return nil
}

func NewDingRobot(robot *conf.Robot) IRobot {
	client := utils.NewRestyHttpClient()
	w := &DingRobot{
		Webhook:    robot.GetWebHook(),
		httpClient: client,
	}
	return w
}
